/*
 * Copyright (c) 2009, Maxim Taran. All Rights Reserved.
 */

package max.utils;

import java.util.*;

/**
 * User: Max
 * Date: 02.08.2008
 * Time: 22:19:52
 */

/**
 * Класс реализует автоматический подсчёт одинаковых объектов, помещаемых в него.
 * @author Максим Таран
 */
public class AutosumMap extends HashMap<Object, Integer> {
    private long summvalues = 0;

    /**
     * Ассоциирует специфическое число со специфическим ключём. Если ранее помещаемый ключ уже имелся в данной карте,
     * то ему будет присвоено новое значение.
     * @param key ключ, с которым будет ассоциированно какое-то число.
     * @param value число, с которым будет ассоциирован ключ.
     * @return прошлое значение, если данный ключ уже имелся в карте. Если ключа ранее не было в карте, то возвращается <tt>null</tt>.
     */
    @Override
    public Integer put(Object key, Integer value) {
        Integer oldvalue = null;
        if (super.containsKey(key)) {
            oldvalue = super.get(key);
            Integer newvalue = oldvalue + value;
            super.put(key, newvalue);
            summvalues += newvalue;
        } else {
            super.put(key, value);
            summvalues += value;
        }
        return oldvalue;
    }

    /**
     * Добавляет ключ в текущую карту. Если значение ранее было в карте, то происходит автоматическое прибавление <tt>1-цы</tt>
     * к значению, которое было в карте. Если значение добавляется в первый раз, то ему автоматически присваивается значени равное <tt>1</tt>.
     * @param key помещаемый ключ.
     * @return возвращает текушее значение ключа <code>key</code>
     */
    public Integer add(Object key) {
        Integer i = 0;
        if (super.containsKey(key)) {
            i = super.get(key);
        }
        super.put(key, ++i);
        summvalues++;
        return i;
    }

    /**
     * Возвращает сумму всех значений в карте.
     * @return сумма всех значений.
     */
    public long getSumValues() {
        return summvalues;
    }

    /**
     * Удаляет ключ и связанное с ним значение.
     * @param key ключ, который нужно удалить из карты.
     * @return предыдущее связанное с этим ключём значение.
     */
    @Override
    public Integer remove(Object key) {
        summvalues -= super.get(key);
        return super.remove(key);
    }
}
